10.4 构建

反射库提供了内置函数make和new的对应操作,其中最有意思的就是MakeFunc。可用它实现通用模板,适应不同数据类型。

// 通用算法函数 func add(args[]reflect.Value) (results[]reflect.Value) { if len(args) ==0{ return nil }

var ret reflect.Value

switch args[0].Kind() { case reflect.Int: n:=0 for_,a:=range args{ n+=int(a.Int()) }

   ret=reflect.ValueOf(n) 

case reflect.String: ss:=make([]string,0,len(args)) for_,s:=range args{ ss=append(ss,s.String()) }

   ret=reflect.ValueOf(strings.Join(ss, "")) 
} 

results=append(results,ret) return }

// 将函数指针参数指向通用算法函数 func makeAdd(fptr interface{}) { fn:=reflect.ValueOf(fptr).Elem() v:=reflect.MakeFunc(fn.Type(),add) // 这是关键 fn.Set(v) // 指向通用算法函数 }

func main() { var intAdd func(x,y int)int var strAdd func(a,b string)string

makeAdd(&intAdd) makeAdd(&strAdd)

println(intAdd(100,200)) println(strAdd(“hello, ”, “world!“)) }

输出:

300 hello,world!

如果语言支付泛型,自然不需要这么折腾。